首页 > 试题广场 >

最长的括号子串

[编程题]最长的括号子串
  • 热度指数:83749 时间限制:C/C++ 1秒,其他语言2秒 空间限制:C/C++ 256M,其他语言512M
  • 算法知识视频讲解
给出一个长度为 n 的,仅包含字符 '(' 和 ')' 的字符串,计算最长的格式正确的括号子串的长度。

例1: 对于字符串 "(()" 来说,最长的格式正确的子串是 "()" ,长度为 2 .
例2:对于字符串 ")()())" , 来说, 最长的格式正确的子串是 "()()" ,长度为 4 .

字符串长度:

要求时间复杂度 ,空间复杂度 .
示例1

输入

"(()"

输出

2
示例2

输入

"(())"

输出

4
class Solution:
    def longestValidParentheses(self, s: str) -> int:
        # write code here
        dp = [0] * (len(s) + 1)
        for i in range(2, len(s) + 1):
            if s[i - 1] == ")":
                if s[i - 2] == "(":
                    dp[i] = dp[i - 2] + 2
                else:
                    if i - dp[i - 1] > 1 and s[i - dp[i - 1] - 2] == "(":
                        dp[i] = dp[i - dp[i - 1] - 2] + dp[i - 1] + 2
        return max(dp)
发表于 2022-08-09 17:40:43 回复(0)
class Solution:
    def longestValidParentheses(self , s: str) -> int:
        # write code here
        n = len(s)
        if (n == 0&nbs***bsp;n == 1):
            return 0
        
        # num[i]表示以s[i]结尾的最大正确括号长度
        # 我们使用动态规划求出num,然后返回max(num)
        # 时间和空间复杂度均为O(n)
        num = [0 for i in range(n)]
        
        for i in range(1, n):
            
            #如果结尾是左括号,那必定是没有以左括号结尾的正确子串的
            if (s[i] == '('):
                num[i] = 0
            
            # 如果是右括号结尾
            else:
                # 记以s[i-1]结尾的最长子串长度为k
                # 即s[i-k: i]为前面的正确括号子串,我们要对比i和i-k-1是否能在外面继续形成一对括号
                k = num[i-1]
                # 首先判断i-k-1是否存在
                if (i-k-1 < 0):
                    
                    # 若前面没有i-k-1了,意味着i==k,也就是前i个字符有i和正确括号,刚好匹配完
                    # 那么s[i]只可能与s[i-1]形成括号对
                    if (s[i-1] == '('):
                        num[i] = 2
                    else:
                        num[i] = 0
                    continue
                
                # 如果前面的i-k-1>=0
                if (s[i] == ')' and s[i-k-1] == '('):
                    # 这里s[i]和s[i-k-1]在s[i-k :i]外面又构成了一对括号,因此长度加二
                    num[i] = num[i-1] + 2
                    # 这里我们要判断长度加二的新括号串s[i-k-1,i-1]会不会跟s[i-k-2]为结尾的括号串连起来
                    if (i-k-2 >=1):
                        num[i] += num[i-k-2]
                
        print(num)                
        return max(num)
        

发表于 2022-04-14 16:08:13 回复(0)
class Solution:
    def longestValidParentheses(self , s ):
        # write code here
        n = len(s)
        g = [0]*n
        maxlen = 0
        for i in range(1, n):
            if s[i]==')' and i-1-g[i-1]>=0 and s[i-1-g[i-1]]=='(':
                g[i] = g[i-1] + 2
                if i-g[i]>=0 and g[i-g[i]]>0:
                    g[i] += g[i-g[i]]
                maxlen= max(maxlen, g[i])
        return maxlen

发表于 2021-08-13 15:50:08 回复(2)

问题信息

难度:
7条回答 26024浏览

热门推荐

通过挑战的用户